<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
</head>
<body>
  <script>
    function P(food){
      this.food  = food
    }

    P.prototype.eat = ()=>{
      console.log('eatting');
    }

    P.prototype.sleep = ()=>{
      console.log('slepping');
    }

    // 类的实例化
    let z = new P('apple')
    //实例对象挂载实例对象上 
    console.log(z);
   //类的prototype 方法实例可以调用
    z.eat()
    z.sleep()
    //实例是类的实例
    console.log(z instanceof P);

    // ------------------------------------------
    // new 的实现原理
 
    // 实现_new
    function _new(C,...args){
      //1 创建实例对象
      let o = {}

      // 构建实例o 和 类关系：o实例的__proto__ 和 类的prototype指向同一个对象（原型对象）
      //  instanceof 判断依据
      //  C.prototype 原型方法 实例也可以使用 ;  lisi.eat()=>o.eat=>o.__proto__.eat= C.prototype.eat
      o.__proto__ = C.prototype

      //2 this指向对象实例o
      C.call(o,...args) //this.food  = food=>o.food = 'apple'
      console.log(o.food);

      //3 默认返回实例对象
      return o
    }

     // _new() 上面的结果
    let lisi = _new(P,'apple')
      console.log(lisi);
      lisi.eat()
      // lisi.sleep()
      
      console.log(lisi instanceof P);

 

 </script>
  
</body>
</html>